package day26.yichang;

// 自定义异常类，继承自Exception表示这是一个受检异常
// 当年龄超出合理范围时抛出此异常
class AgeOutOfBoundsException extends Exception {
    // 无参构造方法，调用父类的无参构造方法
    public AgeOutOfBoundsException() {
        super();
    }
    
    // 带参数构造方法，传入异常信息，调用父类的带参构造方法
    public AgeOutOfBoundsException(String message) {
        super(message);
    }
}

// 学生类，用于演示自定义异常的使用场景
class Student {
    // 学生姓名属性
    private String name;
    // 学生年龄属性
    private int age;
    
    // 带参构造方法，可能会抛出自定义异常AgeOutOfBoundsException
    // 当传入的年龄不在合理范围内时会抛出异常
    public Student(String name, int age) throws AgeOutOfBoundsException {
        // 验证年龄是否在合理范围内(0-150岁)
        if (age < 0 || age > 150) {
            // 如果年龄不在合理范围内，抛出自定义异常，并附带详细的错误信息
            throw new AgeOutOfBoundsException("年龄必须在0-150之间，当前输入为: " + age);
        }
        // 年龄验证通过，设置学生属性
        this.name = name;
        this.age = age;
    }
    
    // 获取学生姓名的getter方法
    public String getName() {
        return name;
    }
    
    // 获取学生年龄的getter方法
    public int getAge() {
        return age;
    }
    
    // 重写toString方法，用于格式化输出学生信息
    @Override
    public String toString() {
        return "Student{name='" + name + "', age=" + age + "}";
    }
}

/**
 * 自定义异常示例
 * 演示如何创建和使用自定义异常来处理业务逻辑中的特殊情况
 * 自定义异常可以让程序错误处理更加清晰和具体
 */
public class CustomExceptionDemo {
    // 程序入口方法
    public static void main(String[] args) {
        System.out.println("=== 自定义异常示例 ===");
        
        // 第一个try-catch块：测试正常情况和负数年龄异常情况
        try {
            // 正常情况：创建年龄为20岁的学生对象
            Student student1 = new Student("张三", 20);
            System.out.println("创建学生成功: " + student1);
            
            // 异常情况：尝试创建年龄为-5岁的学生对象，会抛出AgeOutOfBoundsException异常
            Student student2 = new Student("李四", -5);
            System.out.println("创建学生成功: " + student2);
        } catch (AgeOutOfBoundsException e) {
            // 捕获并处理自定义的年龄越界异常
            System.out.println("捕获自定义异常: " + e.getMessage());
        }
        
        // 第二个try-catch块：测试年龄超过150的异常情况
        try {
            // 异常情况：尝试创建年龄为200岁的学生对象，会抛出AgeOutOfBoundsException异常
            Student student3 = new Student("王五", 200);
            System.out.println("创建学生成功: " + student3);
        } catch (AgeOutOfBoundsException e) {
            // 捕获并处理自定义的年龄越界异常
            System.out.println("捕获自定义异常: " + e.getMessage());
        }
        
        // 程序正常执行完毕
        System.out.println("程序执行完毕");
    }
}